SlideShare a Scribd company logo
1 of 80
Download to read offline
OTIMIZANDO A
PERFORMANCE DE WEBSITES
        EM PHP
FELIPE RIBEIRO
• Graduando     (concluinte) em Ciência da Computação na UFCG

• Zend   Certified Engineer - PHP5

• Trabalha
         como desenvolvedor Web e consultor com foco em
 performance e escalabilidade de Websites

• Experiência   em grids computacionais e sistemas distribuídos

• Membro     fundador do grupo PHP-PB

• Contribuidor   do PHP e Mozilla Camino
OBJETIVO

•O  objetivo desse mini-curso é apresentar alguns dos conceitos
utilizados na otimização da performance e escalabilidade de web
sites

•A abordagem utilizada será bottom-up, ou seja, iniciaremos de
ajustes no servidor e back-end, para depois ajustarmos o front-
end

 • Em   aplicações práticas, essa abordagem depende do problema.

     • Quem   está “sofrendo” mais? Servidor ou cliente?
Performance

a habilidade que uma
aplicação tem de atingir um
objetivo, como por exemplo
responder no menor tempo
possível
Escalabilidade

a habilidade de uma aplicação
manter a performance quando
a carga de trabalho aumenta.
PHP não
é tão
rápido...
Porém sua
arquitetura shared-
nothing simplifica a
     escalabilidade
E PHP
dificilmente
é o gargalo
A maior parte do
  tempo é gasto no
 banco de dados ou
com o carregamento
       do front-end
Sempre dá para
espremer e melhorar
“OTIMIZAÇÃO PREMATURA É A
RAÍZ DE TODOS OS PROBLEMAS”
                DONALD KNUTH
É preciso medir
antes de “adivinhar”
      o que otimizar
É preciso medir
   antes de “adivinhar”
         o que otimizar




E como medir?
Na medição, duas
perguntas precisam
   ser respondidas
1 - Quão rápido
é meu sistema?
1 - Quão rápido
      é meu sistema?
Em aplicações
Web, a métrica
mais comum é o
reqs/sec
1 - Quão rápido
é meu sistema?


Essa pergunta é
respondida com
benchmarks
Testes
de carga
Testes
de carga

ApacheBench (ab)
Siege - www.joedog.org
Macintosh:~ felipe$ ab -c 10 -t 30 -k 'http://shoprizer.localhost/'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking shoprizer.localhost (be patient)
Finished 4379 requests



Server Software:        Apache/2.0.59
Server Hostname:        shoprizer.localhost
Server Port:            80

Document Path:          /
Document Length:        22320 bytes

Concurrency Level:      10
Time taken for tests:   30.010 seconds
Complete requests:      4379
Failed requests:        0
Write errors:           0
Total transferred:      99436344 bytes
HTML transferred:       97806240 bytes
Requests per second:    145.92 [#/sec] (mean)
Time per request:       68.532 [ms] (mean)
Time per request:       6.853 [ms] (mean, across all concurrent requests)
Transfer rate:          3235.74 [Kbytes/sec] received
Macintosh:~ felipe$ siege -b -t30s 'http://shoprizer.localhost/'
** SIEGE 2.67
** Preparing 10 concurrent users for battle.
The server is now under siege...
Lifting the server siege...       done.
Transactions:		          4909 hits
Availability:		        100.00 %
Elapsed time:		         29.84 secs
Data transferred:	        104.49 MB
Response time:	 	           0.06 secs
Transaction rate:	        164.51 trans/sec
Throughput:	 	           3.50 MB/sec
Concurrency:	 	          9.93
Successful transactions:         4909
Failed transactions:	              0
Longest transaction:	           2.28
Shortest transaction:	          0.00
2 - Por que meu
sistema tem essa
performance?
2 - Por que meu
sistema tem essa
performance?



              Profiling
Xdebug
arrebenta no
profiling!
• Instale   a extensão Xdebug

        a opção xdebug.profiler_enable
• Habilite
 caso queira que toda execução gere o log

• Ou a opção
 xdebug.profiler_enable_trigger para que
 o log só seja gerado quando você passar
 ?XDEBUG_PROFILE na URL
• Rode   o script que você quer analisar

• Abra
     o log gerado pelo Xdebug no
 KCacheGrind caso use Linux, ou no
 WebGrind em qualquer outra plataforma.
KCacheGrind
http://code.google.com/p/webgrind/
• xdebug_memory_usage(   ) diz quanto de
 memória o script está usando no momento
 da chamada

• xdebug_peak_memory_usage(  ) diz qual o
 valor máximo de memória que foi usada
 durante a execução
Ajustes nos servidores
APACHE
MOD_DEFLATE


• Comprime     o arquivo com gzip antes de enviar (se o navegador
 suportar)

•O custo de processamento normalmente é compensado com a
 economia de banda

• Só   compacte arquivos de texto (html, xml, css, js)
MOD_DEFLATE

• Configurando:

 $ a2enmod deflate

 /etc/apache2/mods-available/deflate.conf
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain
text/xml text/css application/javascript
</IfModule>
MOD_EXPIRES

• Digaao visitante até quando ele pode usar a versão atual de um
 arquivo sem precisar acessar o servidor novamente

• Useo cache do cliente, economize requisições e dê a ele a
 impressão de mais rapidez

• mod_expires coloca no cabeçalho HTTP a data de expiração
 daquele arquivo
MOD_EXPIRES

 $ a2enmod expires

 No seu .htaccess ou configuração do site:

ExpiresActive On
ExpiresDefault "access plus 30 days"
ExpiresByType text/html "access plus 1 month 15 days
2 hours"
ExpiresByType image/gif "modification plus 5 hours 3
minutes"
DIRECTORYINDEX

• No Apache  você pode configurar o DirectoryIndex que especifica
 qual arquivo é o “index” de cada diretório

• Você pode especificar mais de um e o Apache segue a sequência
 até achar o que exista:
<Directory /var/www>
    DirectoryIndex index.html index.htm index.php
</Directory>
• Paraisso, é feita uma syscall para verificar a existência dos arquivos
 a cada requisição
DIRECTORYINDEX


•O   impacto é pequeno mas podemos evitar isso

• Configure   o DirectoryIndex para ir direto para o arquivo correto

<Directory /var/www>
    DirectoryIndex index.php
</Directory>
Use um servidor a
 parte para
 arquivos estáticos

http://static.example.com
Algo mais leve
    também resolve...


Lighttpd
nginx
thttpd
PHP
APC

• PHPcompila os arquivos (JIT) e gera um código intermediário
 (opcode) a cada execução

• Essa
     compilação pode ser evitada, para isso é necessário fazer
 cache do opcode

•A   solução padrão é o APC

• Virá “built-in” no   PHP6
APC


• Existem   outras alternativas com o mesmo propósito

  • XCache

  • Zend    Platform
APC

•A   instalação é trivial, no Ubuntu basta executar:

 # apt-get install php-apc

• Por   padrão o cache do opcode já é habilitado

•O  parâmetro apc.stat permite que o APC não cheque se o
 arquivo foi alterado (aumentando ainda mais a performance), o
 que é bom para sistemas em produção. Mas qualquer alteração
 implica num restart do Apache.
BANCOS DE
  DADOS
   MySQL
MYSQL
• MySQL     é o SGBD mais comumente utilizado com o PHP
• Foi
    feito com foco em performance, mas com o tempo vem
 ganhando funcionalidades voltadas para integridade relacional e
 consistência dos dados
• Implementa     um cache interno de queries
• Os    principais engines são:
  • MyISAM

  • InnoDB

  • Ambos     usam índices organizados internamente em árvores B
• Qual    escolher?
MYSQL - MYISAM

• Rápida    para leitura

• Table-level   locking

  • Uma     escrita trava todos os acessos paralelos à tabela

  • INSERT  DELAYED é não bloqueante e permite que seu PHP
    continue executando enquanto a query fica na fila para ser
    executada

• Índices   FullText
MYSQL - MYISAM



• Menor     consumo de memória e espaço em disco

• Utiliza   recursos de cache do sistema operacional
MYSQL - INNODB

• Integridade   relacional

  • Chaves     estrangeiras

• Row-level    locking

  • Na  escrita, só é travado para acessos paralelos o registro que
    está sendo escrito

• Maior     consumo de memória e espaço em disco

• Utiliza   implementação própria de cache
ÍNDICES
ÍNDICES


• Índices   agilizam as buscas e tornam as escritas mais lentas

• Transformeem índice todas as colunas que são utilizadas como
 parâmetro de consulta ou ordenação

• Remova  o índice das colunas que não são utilizadas nessas
 situações.
TIPOS DE
 DADOS
TIPOS DE DADOS

• Não   armazene números em VARCHAR

• Não   armazene datas em VARCHAR

• Se   o campo tem tamanho fixo use CHAR

  • Ex.: Uma   senha em MD5 (32) ou SHA1 (41)

• Economiza    espaço e facilita as comparações
CACHE
CACHE


• Cacheé a solução mais comum para otimização de performance
 em diversas áreas da computação

• Consiste
         em armazenar uma informação que é mais acessada num
 meio mais rápido do que a sua real origem.

  • Por   exemplo: Memória RAM serve de cache para o disco
CACHE

• Consulta
         a dados que não se alteram com muita frequência
 podem ser colocadas em cache. Por exemplo:

  • Um site de notícias não precisa acessar o banco todas as vezes
   que uma mesma notícia precisa ser exibida.

  • Um site que agrega conteúdo de vários outros não precisa
   consultar as APIs a cada acesso dos seus usuários. Ele pode
   manter um cache local.
CACHE

• Iremos   discutir a implementação de 4 tipos de cache:

  • Smarty   (Cache em disco)

  • APC    (Cache em memória)

  • Memcache     (Cache em memória em ambiente distribuído)

  • Funky Caching (Cache em disco com a criação de arquivos
   estáticos)
SMARTY

• Smarty   é uma biblioteca muito popular de “template engine”

• Porém ela também oferece a funcionalidade de cache dos
 templates já com as informações agregadas

• Gerandono disco um arquivo específico para cada registro
 “cacheado”

• Você   pode setar um TTL para o objeto em cache
SMARTY
   http://smarty.net/manual/pt_BR/caching.php

<?php
require 'smarty/Smarty.class.php';

$id = (int) $_GET['id'];
$smarty = new Smarty();
$smarty->caching = 1;

if(!$smarty->is_cached('noticia.tpl',$id)) {
    //Carrega do banco de dados
}
$smarty->display('noticia.tpl',$id);
APC

•O mesmo APC que faz cache do Opcode também faz cache de
 objetos na memória

• apc.shm_size   determina quanto de memória o APC pode usar
 para armazenar objetos, quando esse espaço é ocupado, os que
 foram usados a mais tempo são removidos (LRU)

• Você   pode setar um TTL para o objeto em cache
APC
                  http://br.php.net/apc
<?php
$id = (int) $_GET['id'];
$cache_id = "noticia::$id";

if(!($noticia = apc_fetch($cache_id))) {

      $noticia = new Noticia($id);

       //Armazena o valor no cache em memória do APC
      apc_store($cache_id, $noticia);
}

...
MEMCACHE

•O Memcache independe do PHP, é executado como um daemon
 externo

• Conecta-se    via sockets, e por isso não é indicado para grandes
 objetos

• Utiliza   também a política do LRU para remoção

• Você   pode setar um TTL para o objeto em cache
MEMCACHE
          http://br.php.net/memcache
<?php
$id = (int) $_GET['id'];
$cache_id = "noticia::$id";

$memcache = new Memcache();
$memcache->connect('localhost', 11211);

if(!($noticia = $memcache->get($cache_id))) {
    $noticia = new Noticia($id);
    $memcache->set($cache_id,$noticia);
}

...
MEMCACHE

• Memcachetambém pode ser utilizado como mecanismo para
 armazenamento de dados de sessão.

• Isso
     permite que se tenha vários servidores Web e independente
 de qual servidor trate a requisição do usuário, pode-se acessar os
 dados de sessão que estão no servidor Memcache, basta setar no
 php.ini:

 session.save_handler = memcache
 session.save_path = "tcp://host_do_memcache:11211"
FUNKY CACHING


• FunkyCaching é uma técnica não muito elegante mais muito
 eficiente

• Consiste   em criar arquivos html estáticos sob demanda

• Usada   no próprio site php.net
FUNKY CACHING

• No .htaccess ou outro arquivo de configuração do seu site no
 Apache, especifique como página de erro 404 um script PHP que
 é responsável por criar as páginas que não estão em cache.

• Por
    exemplo, no diretório http://www.example.com/noticias/
 poderíamos criar um .htacces com a regra:

 ErrorDocument 404 /noticias/gera_cache.php
FUNKY CACHING

• No gera_noticias.php faríamos tratamento da URL que foi
 requisitada e criaríamos o arquivo caso seja possível, por exemplo:

 • http://www.example.com/noticias/1234.html    indica que o
   usuário quer acessar a notícia de id 1234

 •O   PHP cria esse arquivo e nos próximos acessos o html existirá
   e o PHP não será mais chamado, pois não ocorrerá o erro 404.
FUNKY CACHING
<?php
$id = basename($_SERVER['REDIRECT_URL'], '.html');

/* Acessa a página dinâmica */
$html = file_get_contents(sprintf("http://www.example.com/
noticias.php?id=%d",$id));
/* O ideal é fazer algum tratamento de erros, para evitar a
criação de arquivos para ids inválidos */

/* Exibe o conteúdo */
header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL']));
echo $html;

/* Salva o conteúdo em um arquivo .html */
file_put_contents(sprintf(dirname(__FILE__)."/%d.html", $id),
$html);
E A NÍVEL DE BROWSER?
FIREBUG + YSLOW


• São   plugins para o Mozilla Firefox

• Fazem análise para depuração (Firebug) e otimização (YSlow) de
 toda a parte client-side

• YSlow   foi desenvolvido pelo Yahoo Performance Team
FIREBUG - NET
Mostra o tempo de requisição, espera e download de cada
                componente da página
FIREBUG - NET
YSLOW - GRADE
Analisa vários critérios da página, dá “notas” e dá dicas de como
                             melhorar
YSLOW - GRADE
YSLOW - COMPONENTS
Permite analisar a carga de cada componente carregado
YSLOW - COMPONENTS
YSLOW - STATISTICS
Mostra como a carga está proporcionalmente dividida entre os
    componentes da página, com cache limpo e “quente”
YSLOW - STATISTICS
YSLOW - TOOLS
Ferramentas para compressão de Javascript, imagens, geração de
                relatórios e análise de código
YSLOW - TOOLS
REFERÊNCIAS



• PHP- Simple is Hard - Rasmus Lerdorf - http://talks.php.net/show/
 w2e09

• Alta   performance em Web Sites - Souders - Editora O’Reilly

More Related Content

What's hot

Introdução ao zend framework
Introdução ao zend frameworkIntrodução ao zend framework
Introdução ao zend frameworkMarcos Oliveira
 
Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Claudio Miranda
 
Performance tunning de servidores ColdFusion MX
Performance tunning de servidores ColdFusion MXPerformance tunning de servidores ColdFusion MX
Performance tunning de servidores ColdFusion MXAlex Hübner
 
Usando Hyper-v 2012 para virtualização do SQL Server
Usando Hyper-v 2012 para virtualização do SQL ServerUsando Hyper-v 2012 para virtualização do SQL Server
Usando Hyper-v 2012 para virtualização do SQL Serverleorsilva
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresDouglas V. Pasqua
 
Ebook Apache Server: Guia Introdutório
Ebook Apache Server: Guia IntrodutórioEbook Apache Server: Guia Introdutório
Ebook Apache Server: Guia IntrodutórioFernando Palma
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaHenrique Lima
 
NGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação webNGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação webernaniaz
 
Alta perfomance de aplicações PHP com Nginx
Alta perfomance de aplicações PHP com NginxAlta perfomance de aplicações PHP com Nginx
Alta perfomance de aplicações PHP com NginxThiago Paes
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - AvançadoAdriano Schmidt
 
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPUserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPAndré Déo
 
Desenvolvendo aplicativos web escaláveis
Desenvolvendo aplicativos web escaláveisDesenvolvendo aplicativos web escaláveis
Desenvolvendo aplicativos web escaláveisManuel Lemos
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...Aryel Tupinambá
 
De A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampDe A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampAndré Déo
 
Escalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQEscalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQMatheus Fidelis
 

What's hot (20)

Introdução ao zend framework
Introdução ao zend frameworkIntrodução ao zend framework
Introdução ao zend framework
 
Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7
 
Performance tunning de servidores ColdFusion MX
Performance tunning de servidores ColdFusion MXPerformance tunning de servidores ColdFusion MX
Performance tunning de servidores ColdFusion MX
 
Usando Hyper-v 2012 para virtualização do SQL Server
Usando Hyper-v 2012 para virtualização do SQL ServerUsando Hyper-v 2012 para virtualização do SQL Server
Usando Hyper-v 2012 para virtualização do SQL Server
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 
Tutorial memcached
Tutorial memcachedTutorial memcached
Tutorial memcached
 
Slides nginx
Slides nginxSlides nginx
Slides nginx
 
Ebook Apache Server: Guia Introdutório
Ebook Apache Server: Guia IntrodutórioEbook Apache Server: Guia Introdutório
Ebook Apache Server: Guia Introdutório
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
 
NGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação webNGiNX, o motor da sua aplicação web
NGiNX, o motor da sua aplicação web
 
Security & PHP
Security & PHPSecurity & PHP
Security & PHP
 
Alta perfomance de aplicações PHP com Nginx
Alta perfomance de aplicações PHP com NginxAlta perfomance de aplicações PHP com Nginx
Alta perfomance de aplicações PHP com Nginx
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - Avançado
 
05 servidor dhcp
05   servidor dhcp05   servidor dhcp
05 servidor dhcp
 
07 - Atividade III
07 - Atividade III07 - Atividade III
07 - Atividade III
 
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPUserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
 
Desenvolvendo aplicativos web escaláveis
Desenvolvendo aplicativos web escaláveisDesenvolvendo aplicativos web escaláveis
Desenvolvendo aplicativos web escaláveis
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
 
De A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampDe A a Zabbix Devry Metrocamp
De A a Zabbix Devry Metrocamp
 
Escalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQEscalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQ
 

Viewers also liked

PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09Felipe Ribeiro
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHPRangel Javier
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroJuan Basso
 
Dicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHPDicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHPAlmir Neto
 
Glosario de qbasic liliana
Glosario de qbasic lilianaGlosario de qbasic liliana
Glosario de qbasic lilianakhjhjhjh
 
Assembly para pc-25paginas
Assembly para pc-25paginasAssembly para pc-25paginas
Assembly para pc-25paginasMikeNandes
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintóticaPablo Silva
 
C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem Claudson Oliveira
 
Conceitos básicos de AEDS
Conceitos básicos de AEDSConceitos básicos de AEDS
Conceitos básicos de AEDSPablo Silva
 
CakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloCakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloelliando dias
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoIvan Rosolen
 

Viewers also liked (20)

PHP 5.3 - What's new?
PHP 5.3 - What's new?PHP 5.3 - What's new?
PHP 5.3 - What's new?
 
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09
 
SPL Datastructures
SPL DatastructuresSPL Datastructures
SPL Datastructures
 
Funções em C
Funções em CFunções em C
Funções em C
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiro
 
Dicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHPDicas para aumentar a performance de um software PHP
Dicas para aumentar a performance de um software PHP
 
Glosario de qbasic liliana
Glosario de qbasic lilianaGlosario de qbasic liliana
Glosario de qbasic liliana
 
PROGRAMAS QBASIC
PROGRAMAS QBASICPROGRAMAS QBASIC
PROGRAMAS QBASIC
 
Assembly para pc-25paginas
Assembly para pc-25paginasAssembly para pc-25paginas
Assembly para pc-25paginas
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintótica
 
Introdução ao PHP
Introdução ao PHPIntrodução ao PHP
Introdução ao PHP
 
C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem C# .NET - Um overview da linguagem
C# .NET - Um overview da linguagem
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Conceitos básicos de AEDS
Conceitos básicos de AEDSConceitos básicos de AEDS
Conceitos básicos de AEDS
 
Apostila cobol
Apostila cobolApostila cobol
Apostila cobol
 
Linguagem C - Uniões
Linguagem C - UniõesLinguagem C - Uniões
Linguagem C - Uniões
 
CakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloCakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro bolo
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápido
 
Linguagem C - Estruturas
Linguagem C - EstruturasLinguagem C - Estruturas
Linguagem C - Estruturas
 

Similar to Otimizacao de websites em PHP

Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Web Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+ApacheWeb Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+ApacheDell Technologies
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
ClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs PhpClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs PhpCampus Party Brasil
 
Otimização Front-end para WordPress
Otimização Front-end para WordPressOtimização Front-end para WordPress
Otimização Front-end para WordPressGuga Alves
 
Melhorando o desempenho do seu WordPress
Melhorando o desempenho do seu WordPressMelhorando o desempenho do seu WordPress
Melhorando o desempenho do seu WordPressJulian Fernandes
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Renato Groff
 
Cache em aplicações web
Cache em aplicações webCache em aplicações web
Cache em aplicações webJean Carlo Emer
 
SI - Processos, Threads, Virtualização e Migração de Código
SI - Processos, Threads, Virtualização e Migração de CódigoSI - Processos, Threads, Virtualização e Migração de Código
SI - Processos, Threads, Virtualização e Migração de CódigoFrederico Madeira
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaAlexandre Tarifa
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancadoAmazon Web Services LATAM
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceTiago Peczenyj
 
Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Marcelo Dieder
 
Curso de Performance and Tuning - Linux
Curso de Performance and Tuning - LinuxCurso de Performance and Tuning - Linux
Curso de Performance and Tuning - LinuxDell Technologies
 
T03_LM3: Javascript (2013-2014)
T03_LM3: Javascript (2013-2014)T03_LM3: Javascript (2013-2014)
T03_LM3: Javascript (2013-2014)Carlos Santos
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceJosé Roberto Araújo
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoelliando dias
 

Similar to Otimizacao de websites em PHP (20)

Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Web Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+ApacheWeb Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+Apache
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Cake PHP
Cake PHPCake PHP
Cake PHP
 
ClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs PhpClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs Php
 
Clusterização de Aplicações PHP
Clusterização de Aplicações PHPClusterização de Aplicações PHP
Clusterização de Aplicações PHP
 
Otimização Front-end para WordPress
Otimização Front-end para WordPressOtimização Front-end para WordPress
Otimização Front-end para WordPress
 
Melhorando o desempenho do seu WordPress
Melhorando o desempenho do seu WordPressMelhorando o desempenho do seu WordPress
Melhorando o desempenho do seu WordPress
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
 
Cache em aplicações web
Cache em aplicações webCache em aplicações web
Cache em aplicações web
 
SI - Processos, Threads, Virtualização e Migração de Código
SI - Processos, Threads, Virtualização e Migração de CódigoSI - Processos, Threads, Virtualização e Migração de Código
SI - Processos, Threads, Virtualização e Migração de Código
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancado
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open source
 
Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?
 
Curso de Performance and Tuning - Linux
Curso de Performance and Tuning - LinuxCurso de Performance and Tuning - Linux
Curso de Performance and Tuning - Linux
 
T03_LM3: Javascript (2013-2014)
T03_LM3: Javascript (2013-2014)T03_LM3: Javascript (2013-2014)
T03_LM3: Javascript (2013-2014)
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performance
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 

Otimizacao de websites em PHP

  • 1. OTIMIZANDO A PERFORMANCE DE WEBSITES EM PHP
  • 2. FELIPE RIBEIRO • Graduando (concluinte) em Ciência da Computação na UFCG • Zend Certified Engineer - PHP5 • Trabalha como desenvolvedor Web e consultor com foco em performance e escalabilidade de Websites • Experiência em grids computacionais e sistemas distribuídos • Membro fundador do grupo PHP-PB • Contribuidor do PHP e Mozilla Camino
  • 3. OBJETIVO •O objetivo desse mini-curso é apresentar alguns dos conceitos utilizados na otimização da performance e escalabilidade de web sites •A abordagem utilizada será bottom-up, ou seja, iniciaremos de ajustes no servidor e back-end, para depois ajustarmos o front- end • Em aplicações práticas, essa abordagem depende do problema. • Quem está “sofrendo” mais? Servidor ou cliente?
  • 4. Performance a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível
  • 5. Escalabilidade a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta.
  • 7. Porém sua arquitetura shared- nothing simplifica a escalabilidade
  • 9. A maior parte do tempo é gasto no banco de dados ou com o carregamento do front-end
  • 11. “OTIMIZAÇÃO PREMATURA É A RAÍZ DE TODOS OS PROBLEMAS” DONALD KNUTH
  • 12. É preciso medir antes de “adivinhar” o que otimizar
  • 13. É preciso medir antes de “adivinhar” o que otimizar E como medir?
  • 14. Na medição, duas perguntas precisam ser respondidas
  • 15. 1 - Quão rápido é meu sistema?
  • 16. 1 - Quão rápido é meu sistema? Em aplicações Web, a métrica mais comum é o reqs/sec
  • 17. 1 - Quão rápido é meu sistema? Essa pergunta é respondida com benchmarks
  • 20. Macintosh:~ felipe$ ab -c 10 -t 30 -k 'http://shoprizer.localhost/' This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking shoprizer.localhost (be patient) Finished 4379 requests Server Software: Apache/2.0.59 Server Hostname: shoprizer.localhost Server Port: 80 Document Path: / Document Length: 22320 bytes Concurrency Level: 10 Time taken for tests: 30.010 seconds Complete requests: 4379 Failed requests: 0 Write errors: 0 Total transferred: 99436344 bytes HTML transferred: 97806240 bytes Requests per second: 145.92 [#/sec] (mean) Time per request: 68.532 [ms] (mean) Time per request: 6.853 [ms] (mean, across all concurrent requests) Transfer rate: 3235.74 [Kbytes/sec] received
  • 21. Macintosh:~ felipe$ siege -b -t30s 'http://shoprizer.localhost/' ** SIEGE 2.67 ** Preparing 10 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 4909 hits Availability: 100.00 % Elapsed time: 29.84 secs Data transferred: 104.49 MB Response time: 0.06 secs Transaction rate: 164.51 trans/sec Throughput: 3.50 MB/sec Concurrency: 9.93 Successful transactions: 4909 Failed transactions: 0 Longest transaction: 2.28 Shortest transaction: 0.00
  • 22. 2 - Por que meu sistema tem essa performance?
  • 23. 2 - Por que meu sistema tem essa performance? Profiling
  • 25. • Instale a extensão Xdebug a opção xdebug.profiler_enable • Habilite caso queira que toda execução gere o log • Ou a opção xdebug.profiler_enable_trigger para que o log só seja gerado quando você passar ?XDEBUG_PROFILE na URL
  • 26. • Rode o script que você quer analisar • Abra o log gerado pelo Xdebug no KCacheGrind caso use Linux, ou no WebGrind em qualquer outra plataforma.
  • 29. • xdebug_memory_usage( ) diz quanto de memória o script está usando no momento da chamada • xdebug_peak_memory_usage( ) diz qual o valor máximo de memória que foi usada durante a execução
  • 32. MOD_DEFLATE • Comprime o arquivo com gzip antes de enviar (se o navegador suportar) •O custo de processamento normalmente é compensado com a economia de banda • Só compacte arquivos de texto (html, xml, css, js)
  • 33. MOD_DEFLATE • Configurando: $ a2enmod deflate /etc/apache2/mods-available/deflate.conf <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript </IfModule>
  • 34. MOD_EXPIRES • Digaao visitante até quando ele pode usar a versão atual de um arquivo sem precisar acessar o servidor novamente • Useo cache do cliente, economize requisições e dê a ele a impressão de mais rapidez • mod_expires coloca no cabeçalho HTTP a data de expiração daquele arquivo
  • 35. MOD_EXPIRES $ a2enmod expires No seu .htaccess ou configuração do site: ExpiresActive On ExpiresDefault "access plus 30 days" ExpiresByType text/html "access plus 1 month 15 days 2 hours" ExpiresByType image/gif "modification plus 5 hours 3 minutes"
  • 36. DIRECTORYINDEX • No Apache você pode configurar o DirectoryIndex que especifica qual arquivo é o “index” de cada diretório • Você pode especificar mais de um e o Apache segue a sequência até achar o que exista: <Directory /var/www>     DirectoryIndex index.html index.htm index.php </Directory> • Paraisso, é feita uma syscall para verificar a existência dos arquivos a cada requisição
  • 37. DIRECTORYINDEX •O impacto é pequeno mas podemos evitar isso • Configure o DirectoryIndex para ir direto para o arquivo correto <Directory /var/www>     DirectoryIndex index.php </Directory>
  • 38. Use um servidor a parte para arquivos estáticos http://static.example.com
  • 39. Algo mais leve também resolve... Lighttpd nginx thttpd
  • 40. PHP
  • 41. APC • PHPcompila os arquivos (JIT) e gera um código intermediário (opcode) a cada execução • Essa compilação pode ser evitada, para isso é necessário fazer cache do opcode •A solução padrão é o APC • Virá “built-in” no PHP6
  • 42. APC • Existem outras alternativas com o mesmo propósito • XCache • Zend Platform
  • 43. APC •A instalação é trivial, no Ubuntu basta executar: # apt-get install php-apc • Por padrão o cache do opcode já é habilitado •O parâmetro apc.stat permite que o APC não cheque se o arquivo foi alterado (aumentando ainda mais a performance), o que é bom para sistemas em produção. Mas qualquer alteração implica num restart do Apache.
  • 44. BANCOS DE DADOS MySQL
  • 45. MYSQL • MySQL é o SGBD mais comumente utilizado com o PHP • Foi feito com foco em performance, mas com o tempo vem ganhando funcionalidades voltadas para integridade relacional e consistência dos dados • Implementa um cache interno de queries • Os principais engines são: • MyISAM • InnoDB • Ambos usam índices organizados internamente em árvores B • Qual escolher?
  • 46. MYSQL - MYISAM • Rápida para leitura • Table-level locking • Uma escrita trava todos os acessos paralelos à tabela • INSERT DELAYED é não bloqueante e permite que seu PHP continue executando enquanto a query fica na fila para ser executada • Índices FullText
  • 47. MYSQL - MYISAM • Menor consumo de memória e espaço em disco • Utiliza recursos de cache do sistema operacional
  • 48. MYSQL - INNODB • Integridade relacional • Chaves estrangeiras • Row-level locking • Na escrita, só é travado para acessos paralelos o registro que está sendo escrito • Maior consumo de memória e espaço em disco • Utiliza implementação própria de cache
  • 50. ÍNDICES • Índices agilizam as buscas e tornam as escritas mais lentas • Transformeem índice todas as colunas que são utilizadas como parâmetro de consulta ou ordenação • Remova o índice das colunas que não são utilizadas nessas situações.
  • 52. TIPOS DE DADOS • Não armazene números em VARCHAR • Não armazene datas em VARCHAR • Se o campo tem tamanho fixo use CHAR • Ex.: Uma senha em MD5 (32) ou SHA1 (41) • Economiza espaço e facilita as comparações
  • 53. CACHE
  • 54. CACHE • Cacheé a solução mais comum para otimização de performance em diversas áreas da computação • Consiste em armazenar uma informação que é mais acessada num meio mais rápido do que a sua real origem. • Por exemplo: Memória RAM serve de cache para o disco
  • 55. CACHE • Consulta a dados que não se alteram com muita frequência podem ser colocadas em cache. Por exemplo: • Um site de notícias não precisa acessar o banco todas as vezes que uma mesma notícia precisa ser exibida. • Um site que agrega conteúdo de vários outros não precisa consultar as APIs a cada acesso dos seus usuários. Ele pode manter um cache local.
  • 56. CACHE • Iremos discutir a implementação de 4 tipos de cache: • Smarty (Cache em disco) • APC (Cache em memória) • Memcache (Cache em memória em ambiente distribuído) • Funky Caching (Cache em disco com a criação de arquivos estáticos)
  • 57. SMARTY • Smarty é uma biblioteca muito popular de “template engine” • Porém ela também oferece a funcionalidade de cache dos templates já com as informações agregadas • Gerandono disco um arquivo específico para cada registro “cacheado” • Você pode setar um TTL para o objeto em cache
  • 58. SMARTY http://smarty.net/manual/pt_BR/caching.php <?php require 'smarty/Smarty.class.php'; $id = (int) $_GET['id']; $smarty = new Smarty(); $smarty->caching = 1; if(!$smarty->is_cached('noticia.tpl',$id)) { //Carrega do banco de dados } $smarty->display('noticia.tpl',$id);
  • 59. APC •O mesmo APC que faz cache do Opcode também faz cache de objetos na memória • apc.shm_size determina quanto de memória o APC pode usar para armazenar objetos, quando esse espaço é ocupado, os que foram usados a mais tempo são removidos (LRU) • Você pode setar um TTL para o objeto em cache
  • 60. APC http://br.php.net/apc <?php $id = (int) $_GET['id']; $cache_id = "noticia::$id"; if(!($noticia = apc_fetch($cache_id))) { $noticia = new Noticia($id); //Armazena o valor no cache em memória do APC apc_store($cache_id, $noticia); } ...
  • 61. MEMCACHE •O Memcache independe do PHP, é executado como um daemon externo • Conecta-se via sockets, e por isso não é indicado para grandes objetos • Utiliza também a política do LRU para remoção • Você pode setar um TTL para o objeto em cache
  • 62. MEMCACHE http://br.php.net/memcache <?php $id = (int) $_GET['id']; $cache_id = "noticia::$id"; $memcache = new Memcache(); $memcache->connect('localhost', 11211); if(!($noticia = $memcache->get($cache_id))) { $noticia = new Noticia($id); $memcache->set($cache_id,$noticia); } ...
  • 63. MEMCACHE • Memcachetambém pode ser utilizado como mecanismo para armazenamento de dados de sessão. • Isso permite que se tenha vários servidores Web e independente de qual servidor trate a requisição do usuário, pode-se acessar os dados de sessão que estão no servidor Memcache, basta setar no php.ini: session.save_handler = memcache session.save_path = "tcp://host_do_memcache:11211"
  • 64. FUNKY CACHING • FunkyCaching é uma técnica não muito elegante mais muito eficiente • Consiste em criar arquivos html estáticos sob demanda • Usada no próprio site php.net
  • 65. FUNKY CACHING • No .htaccess ou outro arquivo de configuração do seu site no Apache, especifique como página de erro 404 um script PHP que é responsável por criar as páginas que não estão em cache. • Por exemplo, no diretório http://www.example.com/noticias/ poderíamos criar um .htacces com a regra: ErrorDocument 404 /noticias/gera_cache.php
  • 66. FUNKY CACHING • No gera_noticias.php faríamos tratamento da URL que foi requisitada e criaríamos o arquivo caso seja possível, por exemplo: • http://www.example.com/noticias/1234.html indica que o usuário quer acessar a notícia de id 1234 •O PHP cria esse arquivo e nos próximos acessos o html existirá e o PHP não será mais chamado, pois não ocorrerá o erro 404.
  • 67. FUNKY CACHING <?php $id = basename($_SERVER['REDIRECT_URL'], '.html'); /* Acessa a página dinâmica */ $html = file_get_contents(sprintf("http://www.example.com/ noticias.php?id=%d",$id)); /* O ideal é fazer algum tratamento de erros, para evitar a criação de arquivos para ids inválidos */ /* Exibe o conteúdo */ header(sprintf('%s 200', $_SERVER['SERVER_PROTOCOL'])); echo $html; /* Salva o conteúdo em um arquivo .html */ file_put_contents(sprintf(dirname(__FILE__)."/%d.html", $id), $html);
  • 68. E A NÍVEL DE BROWSER?
  • 69. FIREBUG + YSLOW • São plugins para o Mozilla Firefox • Fazem análise para depuração (Firebug) e otimização (YSlow) de toda a parte client-side • YSlow foi desenvolvido pelo Yahoo Performance Team
  • 70. FIREBUG - NET Mostra o tempo de requisição, espera e download de cada componente da página
  • 72. YSLOW - GRADE Analisa vários critérios da página, dá “notas” e dá dicas de como melhorar
  • 74. YSLOW - COMPONENTS Permite analisar a carga de cada componente carregado
  • 76. YSLOW - STATISTICS Mostra como a carga está proporcionalmente dividida entre os componentes da página, com cache limpo e “quente”
  • 78. YSLOW - TOOLS Ferramentas para compressão de Javascript, imagens, geração de relatórios e análise de código
  • 80. REFERÊNCIAS • PHP- Simple is Hard - Rasmus Lerdorf - http://talks.php.net/show/ w2e09 • Alta performance em Web Sites - Souders - Editora O’Reilly